package com.liaoye.hellocustomview.listener;

import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;

public class MyGestureListener implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {

    private final String TAG = MyGestureListener.class.getSimpleName();

    private final int FLING_MIN_DISTANCE = 100;
    private final int FLING_MIN_VELOCITY = 100;


    /**
     * 用户按下屏幕触发
     * @param e
     * @return
     */
    @Override
    public boolean onDown(MotionEvent e) {
        Log.i(TAG, "onDown: ");
        return false;
    }

    /**
     * 如果果按下的时间超过瞬间，而且在按下的时候没有松开 或者是拖动的该函数就会被触发
     * @param e
     */
    @Override
    public void onShowPress(MotionEvent e) {
        Log.i(TAG, "onShowPress: ");
    }


    /**
     * 从名字中看出一次单独的轻击抬起操作，是轻屏幕立刻抬起才会触发这个函数 如down还有
     * 操作，就不再算是单独操作了， 就不会触发这 函数了。
     * 快一点的话： onDown -> onSingleTapUp  -> onSingleTapConfirmed
     * 慢一点的话： onDown -> onShowPress  -> onSingleTapUp -> onSingleTapConfirmed
     * @param e
     * @return
     */
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        Log.i(TAG, "onSingleTapUp: ");
        return true;
    }

    /**
     *  在屏幕上拖动事件
     * @param e1
     * @param e2
     * @param distanceX
     * @param distanceY
     * @return
     */
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        Log.i(TAG, "onScroll: " + (e2.getX() - e1.getX()) + " " + distanceY);
        return false;
    }

    /**
     * onDown -> onShowPress -> onLongPress
     * 长接触摸屏，超过一定时长，就会触发这个函数
     * @param e
     */
    @Override
    public void onLongPress(MotionEvent e) {
        Log.i(TAG, "onLongPress: ");
    }

    /**
     * 滑屏 用户按下触摸屏、快速移动后松开
     * onDown -> onScroll -> onScroll -> onScroll -> ... -> onFling
     * @param e1 第一个Action_Down MotionEvent
     * @param e2 最后一个Action_Move MotionEvent
     * @param velocityX
     * @param velocityY
     * @return
     */
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.i(TAG, "onFling: e1= " + e1.getX() + " e2 " + e2.getX());
        if(e1.getX() - e2.getX() >= FLING_MIN_DISTANCE && Math.abs(velocityX) >= FLING_MIN_VELOCITY) {
            Log.i(TAG, "向左滑");
        } else if (e2.getX() - e1.getX() >= FLING_MIN_DISTANCE && Math.abs(velocityX) >= FLING_MIN_VELOCITY) {
            Log.i(TAG, "向右滑");
        }
        return true;
    }


    /**
     * 单击事件用来判定该次单击是SingleTap, 而不是DoubleTap  SingleTapUp抬起会调用 是单击事件才会调用 onSingleTapConfirmed
     *
     * @param e
     * @return
     */
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        Log.i(TAG, "onSingleTapConfirmed: ");
        return true;
    }

    /**
     * 双击事件 在第二次单击，先触发 onDoubleTap ，再触 onDown
     * @param e
     * @return
     */
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.i(TAG, "onDoubleTap: ");
        return true;
    }

    /**
     * 双击间隔中发生的动作
     * @param e
     * @return
     */
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        Log.i(TAG, "onDoubleTapEvent: " + e.getAction());
        return true;
    }
}
